﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleTest
{
    internal class LongTaskService
    {
        /// <summary>
        /// 信号量控制 线程的停止和运行。
        /// </summary>
        private static volatile ManualResetEvent m_event = default!;
        private Random m_random;
        private CancellationToken m_token;
        public LongTaskService(CancellationToken token)
        {
            m_token = token;
            m_event = new ManualResetEvent(false);
            m_random = new Random(100);
            DoLongWork();
            m_token.Register(() =>
            {
                //任务取消通知。。。。
                Console.WriteLine("任务被取消了");
            });
        }

        /// <summary>
        /// 开始做任务 
        /// </summary>
        /// <returns></returns>
        Task DoLongWork()
        {
            var task = Task.Run(async () =>
            {


                //异步任务捕获异常常用方式之一。此方式下程序不会崩溃。
                while (!m_token.IsCancellationRequested)
                {
                    m_event.WaitOne();
                    await Task.Delay(3000);
                    // 通过抛出异常拦截当前正在任务。。
                    //m_token.ThrowIfCancellationRequested();
                    Console.WriteLine("努力工作中：" + m_random.Next(1000, 100000));
                }

            });

            return task;
        }

        /// <summary>
        /// 开始任务
        /// </summary>
        public void StartTask()
        {
            m_event?.Set();
        }

        /// <summary>
        /// 暂停任务
        /// </summary>
        public void PauseTask()
        {
            m_event?.Reset();
        }


    }
}
